package com.rickpan.service;

import com.rickpan.entity.Favorite;
import org.springframework.data.domain.Page;

import java.util.List;

/**
 * 收藏文件服务接口
 * 
 * @author RickPan Team
 * @since 2024-01-06
 */
public interface FavoriteService {

    /**
     * 添加收藏
     *
     * @param userId 用户ID
     * @param fileId 文件ID
     * @param itemType 收藏项类型：file-文件，folder-文件夹
     * @param category 分类
     * @param notes 备注
     * @return 收藏记录
     */
    Favorite addFavorite(Long userId, Long fileId, String itemType, String category, String notes);

    /**
     * 取消收藏
     * 
     * @param userId 用户ID
     * @param fileId 文件ID
     * @return 是否成功
     */
    boolean removeFavorite(Long userId, Long fileId);

    /**
     * 更新收藏信息
     * 
     * @param favoriteId 收藏ID
     * @param category 分类
     * @param notes 备注
     * @return 更新后的收藏记录
     */
    Favorite updateFavorite(Long favoriteId, String category, String notes);

    /**
     * 检查是否已收藏
     * 
     * @param userId 用户ID
     * @param fileId 文件ID
     * @return 是否已收藏
     */
    boolean isFavorited(Long userId, Long fileId);

    /**
     * 获取用户收藏列表（分页）
     * 
     * @param userId 用户ID
     * @param category 分类筛选
     * @param search 搜索关键词
     * @param page 页码
     * @param size 页大小
     * @return 分页收藏列表
     */
    Page<Favorite> getFavoritesByUser(Long userId, String category, String search, Integer page, Integer size);

    /**
     * 获取最近收藏的文件
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 最近收藏列表
     */
    List<Favorite> getRecentFavorites(Long userId, Integer limit);

    /**
     * 获取分类统计
     *
     * @param userId 用户ID
     * @return 分类统计列表
     */
    List<CategoryStat> getCategoryStats(Long userId);

    /**
     * 分类统计DTO
     */
    class CategoryStat {
        private String category;
        private Long count;

        public CategoryStat(String category, Long count) {
            this.category = category;
            this.count = count;
        }

        public String getCategory() { return category; }
        public void setCategory(String category) { this.category = category; }
        public Long getCount() { return count; }
        public void setCount(Long count) { this.count = count; }
    }

    /**
     * 批量添加收藏
     * 
     * @param userId 用户ID
     * @param fileIds 文件ID列表
     * @param category 分类
     * @return 成功添加的数量
     */
    int batchAddFavorites(Long userId, List<Long> fileIds, String category);

    /**
     * 批量取消收藏
     * 
     * @param userId 用户ID
     * @param fileIds 文件ID列表
     * @return 成功取消的数量
     */
    int batchRemoveFavorites(Long userId, List<Long> fileIds);
}
